package com.ruoyi.client.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.bookbus.domain.BookCart;
import com.ruoyi.bookbus.domain.BookProduct;
import com.ruoyi.client.mapper.CartMapper;
import com.ruoyi.client.pojo.form.BatchIdsForm;
import com.ruoyi.client.pojo.form.CartAddForm;
import com.ruoyi.client.pojo.form.CartUpdateForm;
import com.ruoyi.client.pojo.vo.CartVo;
import com.ruoyi.client.service.CartService;
import com.ruoyi.client.service.GoodsService;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service("ClientCartServiceImpl")
public class CartServiceImpl implements CartService {
    @Resource(name = "ClientCartMapper") //注入指定命名的Bean
    private CartMapper cartMapper;
    @Resource
    private GoodsService goodsService;

    /**
     * 增加商品至购物车中
     */
    @Override
    public Boolean add(CartAddForm form) {
        // 检查当前登录用户Id
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();
        
        //检查商品是否存在
        BookProduct product = goodsService.selectByPrimaryKey(form.getProductId());
        if (product == null) {
            throw new ServiceException("商品不存在");
        }
        
        //检查商品数量
        if (form.getCount() == null || form.getCount() < 1) {
            throw new ServiceException("商品数量不能小于1");
        }

        //购物车商品不能有重复项,如果重复，则累加数量
        BookCart cartDb = cartMapper.selectByUserIdAndProductId(userId, form.getProductId());
        if (cartDb != null) {
            //数据库中已有记录，则累加
            Long newCount = cartDb.getCount() + form.getCount();
            cartDb.setCount(newCount);
            // 更新商品名称和图片（防止商品信息变更）
            cartDb.setProductName(product.getTitle());
            cartDb.setImg(product.getPic());
            return cartMapper.update(cartDb) > 0;
        } else {
            //数据库中没有记录，新增
            BookCart cart = new BookCart();
            cart.setUserId(userId);
            cart.setProductId(form.getProductId());
            cart.setProductName(product.getTitle()); // 设置商品名称
            cart.setImg(product.getPic()); // 设置商品图片
            cart.setCount(form.getCount());
            cart.setChecked(0); // 默认未勾选
            return cartMapper.insert(cart) > 0;
        }
    }

    /**
     * 删除购物车中的商品
     */
    @Override
    public Boolean deleteById(Long id) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();
        
        // 验证购物车项是否存在且属于当前用户
        BookCart cart = cartMapper.selectByPrimaryKey(id);
        if (cart == null || !cart.getUserId().equals(userId)) {
            throw new ServiceException("无权操作此购物车项");
        }

        return cartMapper.deleteByPrimaryKey(id) > 0;
    }

    /**
     * 删除购物车中的商品（多个）
     */
    @Override
    public Boolean deleteBatch(BatchIdsForm form) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();

        //检查参数
        if (form == null || form.getIds() == null || form.getIds().length < 1) {
            throw new ServiceException("参数错误");
        }
        
        // 验证所有购物车项都属于当前用户
        for (Long id : form.getIds()) {
            BookCart cart = cartMapper.selectByPrimaryKey(id);
            if (cart == null || !cart.getUserId().equals(userId)) {
                throw new ServiceException("无权操作此购物车项");
            }
        }
        
        return cartMapper.deleteBatch(form.getIds()) > 0;
    }

    /**
     * 删除购物车中的商品（我的全部）
     */
    @Override
    public Boolean deleteAllByMy() {
        // 检查当前登录用户Id
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();
        return cartMapper.deleteByUserId(userId) > 0;
    }


    /**
     * 更改购物车项 （数量、是否勾选）
     */
    @Override
    public Boolean update(CartUpdateForm form) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();
        
        // 验证购物车项是否存在且属于当前用户
        BookCart existingCart = cartMapper.selectByPrimaryKey(form.getId());
        if (existingCart == null) {
            throw new ServiceException("购物车项不存在");
        }
        if (!existingCart.getUserId().equals(userId)) {
            throw new ServiceException("无权操作此购物车项");
        }

        BookCart cart = new BookCart();
        cart.setId(form.getId());
        // 注意：更新时不应该修改userId，所以不设置userId
        if (form.getCount() != null) {
            cart.setCount(form.getCount());
        }
        if (form.getChecked() != null) {
            cart.setChecked(form.getChecked());
        }

        //更改记录,并返回
        return cartMapper.update(cart) > 0;
    }

    /**
     * 更改我的购物车全部项是否勾选 用户全选/全不选
     */
    @Override
    public Boolean updateIsCheckedAll(Boolean isChecked) {
        // 检查当前登录用户Id
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();
        Integer checkedValue = Boolean.TRUE.equals(isChecked) ? 1 : 0;
        return cartMapper.updateIsCheckedAllByUserId(userId, checkedValue) > 0;
    }

    /**
     * 查询我的购物车列表
     */
    @Override
    public List<CartVo> listByMy() {
        // 检查当前登录用户Id
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();

        return cartMapper.listByUserId(userId);
    }

    /**
     * 查询我的购物车列表（已勾选的）
     */
    @Override
    public List<CartVo> listIsCheckedByMy() {
        // 检查当前登录用户Id
        if (!StpUtil.isLogin()) {
            throw new ServiceException("用户未登录");
        }
        Long userId = StpUtil.getLoginIdAsLong();

        return cartMapper.listIsCheckedByUserId(userId);
    }




}